package busterminal.persistence.jdbc.proxy;

import busterminal.entity.Route;
import busterminal.entity.StoppingPoint;
import busterminal.entity.service.RouteType;
import busterminal.persistence.RouteDAO;
import busterminal.services.ServiceLocator;
import java.util.ArrayList;

/**
 * Класс - заместитель маршрута
 */
public class RouteProxy implements Route {

    /**
     * Идентификатор объекта в базе данных
     */
    private int id;
    /**
     * Proxy-объект маршрута
     */
    private Route proxyObject;

    /**
     * Конструктор по умолчанию
     */
    public RouteProxy() {
    }

    /**
     * Параметризованный конструктор
     * @param id идентификатор объекта в базе данных
     */
    public RouteProxy(int id) {
        this.id = id;
    }

    /**
     * Получить proxy-объект: если он не загружен, то загрузить и получить
     * @return proxy-объект
     */
    private Route getProxy() {
        if (proxyObject == null) {
            proxyObject = ServiceLocator.getService(RouteDAO.class).read(id);
        }
        return proxyObject;
    }

    /**
     * Получить идентификатор
     * @return идентификатор
     */
    @Override
    public Integer getId() {
        return id;
    }

    /**
     * Установить идентификатор
     * @param id идентификатор
     */
    @Override
    public void setId(Integer id) {
        this.id = id;
    }

    /**
     * Получить конец маршрута
     * @return конец маршрута
     */
    @Override
    public StoppingPoint getEndPoint() {
        return getProxy().getEndPoint();
    }

    /**
     * Установить конец маршрута
     * @param endPoint конец маршрута
     */
    @Override
    public void setEndPoint(StoppingPoint endPoint) {
        getProxy().setEndPoint(endPoint);
    }

    /**
     * Получить список промежуточных остановочных пунктов
     * @return список промежуточных остановочных пунктов
     */
    @Override
    public ArrayList<StoppingPoint> getIntermediateStoppingPointsList() {
        return getProxy().getIntermediateStoppingPointsList();
    }

    /**
     * Установить список промежуточных остановочных пунктов
     * @param intermediateStoppingPointsList список промежуточных остановочных пунктов
     */
    @Override
    public void setIntermediateStoppingPointsList(ArrayList<StoppingPoint> intermediateStoppingPointsList) {
        getProxy().setIntermediateStoppingPointsList(intermediateStoppingPointsList);
    }

    /**
     * Получить название маршрута
     * @return название маршрута
     */
    @Override
    public String getRouteName() {
        return getProxy().getRouteName();
    }

    /**
     * Установить название маршрута
     * @param routeName название маршрута
     */
    @Override
    public void setRouteName(String routeName) {
        getProxy().setRouteName(routeName);
    }

    /**
     * Получить номер маршрута
     * @return номер маршрута
     */
    @Override
    public String getRouteNumber() {
        return getProxy().getRouteNumber();
    }

    /**
     * Установить номер маршрута
     * @param routeNumber номер маршрута
     */
    @Override
    public void setRouteNumber(String routeNumber) {
        getProxy().setRouteNumber(routeNumber);
    }

    /**
     * Получить тип маршрута, определяемый константой из {@link RouteType}
     * @return тип маршрута, определяемый константой из {@link RouteType}
     */
    @Override
    public RouteType getRouteType() {
        return getProxy().getRouteType();
    }

    /**
     * Установить тип маршрута, определяемый константой из {@link RouteType}
     * @param routeType тип маршрута, определяемый константой из {@link RouteType}
     */
    @Override
    public void setRouteType(RouteType routeType) {
        getProxy().setRouteType(routeType);
    }

    /**
     * Получить начало маршрута
     * @return начало маршрута
     */
    @Override
    public StoppingPoint getStartPoint() {
        return getProxy().getStartPoint();
    }

    /**
     * Установить начало маршрута
     * @param startPoint начало маршрута
     */
    @Override
    public void setStartPoint(StoppingPoint startPoint) {
        getProxy().setStartPoint(startPoint);
    }

    /**
     * Получить строку, содержащую список промежуточных остановочных пунктов
     * @return строку, содержащая список промежуточных остановочных пунктов
     */
    @Override
    public String getIntermediateStoppingPointsString() {
        return getProxy().getIntermediateStoppingPointsString();
    }
    
    /**
     * Метод, возвращающий текстовое представление объекта
     * @return текстовое представление объекта
     */
    @Override
    public String toString() {
        return "RouteProxy{" + "id=" + id + ", proxyObject=" + getProxy() + '}';
    }
}
